<?php
/**
 * 登录 管理
 *
 * @author    Alex Xun xunzhibin@expert.com
 * @version   1.0
 * @copyright (C) 2018 Jnexpert Ltd. All rights reserved
 * @file      web\controller\v1\Login.php
 */

namespace app\web\controller\v1;

use controller\BasicWechat;

/**
 * 登录 控制器类
 *
 * @author Alex Xun xunzhibin@jnexpert.com
 * @package controller
 */
class Login extends BasicWechat
{
    /**
     * 公众号 第三方库 初始化
     *
     * 根据具体所需服务，实例不同的接口类
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     */
    protected function initVendor()
    {
        // 实例化 第三方库
        $this->wechat = new \WeChat\Oauth($this->config);
    }

    /**
     * 微信内授权登录
     *
     * 根据提交数据中的授权类型，发起不同的授权
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     */
    public function index()
    {
        // code
        if( !isset($_GET['code']) )
        {
            $this->get_code();
        }

        // 通过code换取网页授权access_token
        $result = $this->wechat->getOauthAccessToken();

        // 拉取用户信息
        if( isset($this->data['is_user']) && (int)$this->data['is_user'] === 1) {
            $data = $this->wechat->getUserInfo($result['access_token'], $result['openid']);
        }

        // 登录 来源
        $data['from'] = isset($this->data['from']) ? $this->data['from'] : '';

        // 授权成功 将用户信息 以post方法 重定向 到指定URL
        $redirect_url = isset($this->data['redirect']) && $this->data['redirect']
                        ? $this->data['redirect']
                        : $this->config['OAuth_redirect_url'];
        $this->redirect_post($redirect_url, $data);
    }

    /**
     * code
     *
     * 用户同意授权，获取code
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     */
    protected function get_code()
    {
        // 授权后重定向的回调链接地址
        $redirect_url = '';
        $url = parse_url($this->request->url(true));
        // 传输协议 http、https
        $redirect_url .= $url['scheme'] . '://';
        // 主机名(域名)
        $redirect_url .= $url['host'];
        // URI(路径)
        $redirect_url .= $url['path'];
        // 传递参数
        $redirect_url .= '?' . $url['query'];

        // 重定向后会带上state参数，开发者可以填写a-zA-Z0-9的参数值，最多128字节
        $state = 'STATE';
        if(isset($this->data['state']) && $this->data['state']) {
            $state = $this->data['state'];
        }

        /**
         * 应用授权作用域
         * snsapi_base      不弹出授权页面，直接跳转，只能获取用户openid
         * snsapi_userinfo  弹出授权页面，可通过openid拿到用户信息
         */
        $scope = 'snsapi_base';
        if(isset($this->data['is_user']) && (int)$this->data['is_user'] === 1) {
            $scope = 'snsapi_userinfo';
        }

        // 执行操作
        $result = $this->wechat->getOauthRedirect($redirect_url, $state, $scope);

        Header("Location: $result");

        exit;
    }

    /**
     * post 重定向
     *
     * 循环将参数设置到form表单中，以POST方式，用JavaScript自动提交到指定URL中
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     *
     * @param string $url 重定向URL
     * @param array $data 重定向参数数组
     */
    protected function redirect_post($url, $data)
    {
        //循环拼接表单项
        $form_item = '';
        foreach($data as $key => $value) {
            if( is_array($value) ) {
                // 多选
                reset($value); // 内部指针重置到第一个元素
                $row = each($value); // 获取第一个元素的key和value

                do {
                    $form_item .= "<input name='{$key}' type='checkbox' checked value='{$row['value']}'/>";
                } while( ( $row = each($value) ) ); // 从第二个元素开始循环
            } else {
                // input
                $form_item .= "<input name='{$key}' type='text' value='{$value}'/>";
            }
        }

        //构造表单并跳转
$content=<<<EOF
    <form style='display:none;' name='submit_form' id='submit_form' action='{$url}' method='post'>
    {$form_item}
    </form>
    <script type="text/javascript">
        document.submit_form.submit();
    </script>
EOF;
        exit($content);
    }
}
